package com.colin.library.view.custom;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

import com.colin.library.view.help.ViewLogHelp;

/**
 * 自定义ViewGroup 抽象类
 * <p>
 * 1.构造函数
 * 2.onMeasure()        测量View大小
 * 3.onSizeChanged()    确定View大小
 * 4.onLayout()         ViewGroup确定子View布局位置
 * 5.onDraw()           绘制内容(画笔包括:颜色，粗细等去绘画)
 * <p>
 * 6.对外提供操作方法和监听回调
 */

public class CustomViewGroup extends ViewGroup {

    //一般在直接New一个View的时候调用。
    public CustomViewGroup(Context context) {
        this(context, null, 0);
    }

    //一般在layout文件中使用的时候会调用，关于它的所有属性(包括自定义属性)都会包含在attrs中传递进来。
    public CustomViewGroup(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CustomViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    /**
     * ViewGroup类型，都需要在重写onMeasure()方法，
     * 遍历所有子View，设置每个子View的大小。基本思想如下：遍历所有子View，设置每个子View的大小
     * View的大小不仅由自身所决定，同时也会受到父控件的影响，为了我们的控件能更好的适应各种情况，一般会自己进行测量
     * <p>
     * UNSPECIFIED	00	默认值，父控件没有给子view任何限制，子View可以设置为任意大小。
     * EXACTLY	    01	表示父控件已经确切的指定了子View的大小。
     * AT_MOST	    10	表示子View具体大小没有尺寸限制，但是存在上限，上限一般为父View大小。
     *
     * @param widthMeasureSpec
     * @param heightMeasureSpec
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        ViewLogHelp.e("onMeasure");
////        //调用ViewGroup类中测量子类的方法
////        measureChildren(widthMeasureSpec, heightMeasureSpec);
//        //如果对View的宽高进行修改了，不要调用 super.onMeasure( widthMeasureSpec, heightMeasureSpec);
//        //要调用 setMeasuredDimension( widthsize, heightsize); 这个函数。
//        setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
//                getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
//
//        measureChildren(widthMeasureSpec,heightMeasureSpec);

        //必须调用super.onMeasure()或者直接调用setMeasuredDimension()方法设置该View大小，否则会报异常。
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        /**
         * 获得此ViewGroup上级容器为其推荐的宽和高，以及计算模式
         */
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
        int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);


        // 计算出所有的childView的宽和高
        measureChildren(widthMeasureSpec, heightMeasureSpec);


        /**
         * 记录如果是wrap_content是设置的宽和高
         */
        int width = 0;
        int height = 0;

        int count = getChildCount();

        MarginLayoutParams marginLayoutParams = null;
        /**
         * 根据childView计算的出的宽和高，以及设置的margin计算容器的宽和高，主要用于容器是warp_content时
         */
        for (int i = 0; i < count; i++) {
            View childView = getChildAt(i);
            // 测量每一个child的宽和高
            measureChild(childView, widthMeasureSpec, heightMeasureSpec);

            marginLayoutParams = (MarginLayoutParams) childView.getLayoutParams();
            width = childView.getMeasuredWidth();
            height = childView.getMeasuredHeight();
            width += marginLayoutParams.leftMargin + marginLayoutParams.rightMargin;
            height += marginLayoutParams.topMargin + marginLayoutParams.bottomMargin;
        }
        /**
         * 如果是wrap_content设置为我们计算的值
         * 否则：直接设置为父容器计算的值
         */
        setMeasuredDimension((widthMode == MeasureSpec.EXACTLY) ? sizeWidth : width,
                (heightMode == MeasureSpec.EXACTLY) ? sizeHeight : height);
    }

//    /**
//     * 遍历所有的子view去测量自己（跳过GONE类型View）
//     *
//     * @param widthMeasureSpec  父视图的宽详细测量值
//     * @param heightMeasureSpec 父视图的高详细测量值
//     */
//    @Override
//    protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) {
//        ViewLogHelp.e("measureChildren");
//        super.measureChildren(widthMeasureSpec, heightMeasureSpec);
//
//    }
//
//    @Override
//    protected void measureChild(View child, int parentWidthMeasureSpec, int parentHeightMeasureSpec) {
//        ViewLogHelp.e("measureChild");
//        super.measureChild(child, parentWidthMeasureSpec, parentHeightMeasureSpec);
//    }

    /**
     * 在测量完View并使用setMeasuredDimension函数之后View的大小基本上已经确定了，那么为什么还要再次确定View的大小呢？
     * 这是因为View的大小不仅由View本身控制，而且受父控件的影响，所以我们在确定View大小的时候最好使用系统提供的onSizeChanged回调函数。
     *
     * @param w    宽度
     * @param h    高度
     * @param oldw 上一次宽度
     * @param oldh 上一次高度
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
    }

    /**
     * 确定子View布局位置(onLayout)
     * onLayout对其所有childView进行定位（设置childView的绘制区域）
     * 确定布局的函数是onLayout，它用于确定子View的位置，在自定义ViewGroup中会用到，他调用的是子View的layout函数。
     *
     * @param changed
     * @param l
     * @param t
     * @param r
     * @param b
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int cCount = getChildCount();
        int cWidth = 0;
        int cHeight = 0;
        MarginLayoutParams cParams = null;
    }


}
